package stablediffusion

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"fmt"
)

type Txt2ImgRequest struct {
	// EnableHr bool `json:"enable_hr"` //是否开启高清修复
	// DenoisingStrength float32 `json:"denoising_strength"` //重绘幅度
	// FirstphaseWidth   int      `json:"firstphase_width"`
	// FirstphaseHeight  int      `json:"firstphase_height"`
	// HrScale           int    `json:"hr_scale"`             //放大倍数
	// HrUpscaler        string `json:"hr_upscaler"`          //放大算法
	// HrSecondPassSteps int    `json:"hr_second_pass_steps"` //放大步数
	// HrResizeX         int      `json:"hr_resize_x"`
	// HrResizeY         int      `json:"hr_resize_y"`
	Prompt string `json:"prompt"`
	// Styles            []string `json:"styles"` //风格 anime
	Seed int `json:"seed"`
	// Subseed           int      `json:"subseed"`
	// SubseedStrength   int      `json:"subseed_strength"`
	// SeedResizeFromH   int      `json:"seed_resize_from_h"`
	// SeedResizeFromW   int      `json:"seed_resize_from_w"`
	// SamplerName string `json:"sampler_name"` //采样方法
	BatchSize int `json:"batch_size"` //每次生成几张图
	// NIter             int      `json:"n_iter"` //生成批次
	Steps    int `json:"steps"`     //生成步数
	CfgScale int `json:"cfg_scale"` //提示词相关性 1-30 7常用
	Width    int `json:"width"`
	Height   int `json:"height"`
	// RestoreFaces bool `json:"restore_faces"` //脸部修复
	// Tiling            bool     `json:"tiling"` //是否可平铺
	// DoNotSaveSamples  bool     `json:"do_not_save_samples"`
	// DoNotSaveGrid     bool     `json:"do_not_save_grid"`
	NegativePrompt string `json:"negative_prompt"`
	// Eta               int      `json:"eta"`
	// SMinUncond        int      `json:"s_min_uncond"`
	// SChurn            int      `json:"s_churn"`
	// STmax             int      `json:"s_tmax"`
	// STmin             int      `json:"s_tmin"`
	// SNoise            int      `json:"s_noise"`
	OverrideSettings map[string]interface {
	} `json:"override_settings"` // sd_model_checkpoint 切换本次模型
	// OverrideSettingsRestoreAfterwards bool `json:"override_settings_restore_afterwards"`
	// ScriptArgs                        []interface{} `json:"script_args"`
	SamplerIndex string `json:"sampler_index,omitempty"` //采样方法
	// ScriptName   string `json:"script_name"`   //
	SendImages bool          `json:"send_images"` //是否返回 base64图片文件
	SaveImages bool          `json:"save_images"`
	ScriptArgs []interface{} `json:"script_args,omitempty"`
	// AlwaysonScripts struct {
	// } `json:"alwayson_scripts"`
}

func (t Txt2ImgRequest) Value() (v driver.Value, err error) {
	return json.Marshal(t)
}

// 实现 sql.Scanner 接口，Scan 将 value 扫描至 Json
func (t *Txt2ImgRequest) Scan(value interface{}) error {
	bytes, ok := value.([]byte)
	if !ok {
		return errors.New(fmt.Sprint("Failed to unmarshal JSON value:", value))
	}

	err := json.Unmarshal(bytes, t)
	return err
}

type SdModelsReply struct {
	Title     string `json:"title"` //设置当前模型使用此字段
	ModelName string `json:"model_name"`
	Hash      string `json:"hash"`
	Sha256    string `json:"sha256"`
	Filename  string `json:"filename"`
}
